package com.duck.inspection.controller;

import com.duck.common.domain.Result;
import com.duck.inspection.domain.dto.BodyMeasurementDto;
import com.duck.inspection.domain.dto.DuckCountDto;
import com.duck.inspection.domain.po.DuckMetricsPojo;
import com.duck.inspection.service.AIService;
import com.duck.inspection.utils.DuckMetricsGenerator;
import com.duck.inspection.utils.QianWenChat;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequiredArgsConstructor
@RequestMapping("/analysis/")
public class AnalysisController {

    private final DuckMetricsGenerator generator;

    private final AIService aiService;
    @PostMapping("/Breeding")
    public Result analysisBreeding(@RequestBody BodyMeasurementDto body) {
        String prompt = String.format(
                """
                        # 临武鸭育种优化分析任务书

                        ## 背景数据
                        品种：临武鸭（蛋肉兼用型）
                        体尺参数（单位：kg/cm）：
                        - 体重：%.2f（标准范围：2.8-3.2kg）
                        - 体斜长：%.1f（行业标准：28-32cm）
                        - 颈长：%.1f（优质种鸭应≥14cm）
                        - 半潜水长：%.1f（理想值：38-42cm）
                        - 龙骨长：%.1f（建议≥20cm）
                        - 胸宽：%.1f（正常范围：12-14cm）
                        - 胸深：%.1f（理想值：11-13cm）
                        - 胫长：%.1f（种鸭选育标准≥9.5cm）

                        ## 分析要求
                        1. **指标偏离分析**：用★标记低于/超出标准的参数
                        2. **优化方案**：
                           - 选配策略：父本母本性状互补方案
                           - 饲养调整：针对2个最需改进的指标设计营养方案
                           - 遗传规划：提出2代内核心性状优化路径
                        3. **输出格式**：
                           ✅ 建议1：【选配】...（关联参数：胸深+胫长）
                           ✅ 建议2：【营养】...（目标：胸宽提升至13cm）
                           ✅ 建议3：【遗传】...（预期：3代龙骨长≥22cm）

                        请按上述模板直接输出专业分析：""",
                body.getWeight(),
                body.getBodyLength(),
                body.getNeckLength(),
                body.getSemiDiveLength(),
                body.getKeelLength(),
                body.getChestWidth(),
                body.getChestDepth(),
                body.getTibiaLength()
        );

        String result = QianWenChat.callWithMessage(prompt);
        return new Result(result, 200, "分析成功");
    }

    @PostMapping("/FeedRatio")
    public Result analyzeFeed(@RequestBody BodyMeasurementDto body) {
        // 通过体尺数据智能推导生长阶段
        String growthStage = inferGrowthStage(body.getWeight(), body.getChestWidth());

        String prompt = String.format(
                """
                        # 临武鸭精细化饲料方案设计报告

                        ## 个体体征分析
                        **生物指标**：
                        - 实测体重：%.2fkg（行业基准值：2.8-3.2kg）
                        - 胸宽维度：%.1fcm（优质商品鸭≥13cm）
                        - 胫骨长度：%.1fcm（种系标准≥9.5cm）
                        - **生长阶段判定**：%s（依据《水禽生长阶段划分标准GB/T 2023-17》）

                        ## 配方设计原则
                        根据体征特征与养殖目标，制定以下三阶方案：

                        ### 方案一：胸肌强化方案
                        **设计思路**：
                        采用高支链氨基酸配比，重点提升：
                        - 动物蛋白占比：≥28%%（鱼粉+豆粕复合体系）
                        - 代谢能水平：12.5MJ/kg±5%%
                        - 添加功能成分：0.3%%精氨酸+0.15%%谷氨酰胺
                        **成本控制**：允许较常规配方上浮18-22%%
                        **预期效益**：胸肌率提升15-18%%，料肉比维持3.2:1

                        ### 方案二：成本优先方案
                        **原料策略**：
                        - 主料采用本地菜籽粕（≤25%%）+米糠（30%%）
                        - 补充非蛋白氮源：2%%尿素（需配合硫元素）
                        - 添加复合酶制剂提升消化率
                        **营养指标**：
                        - 粗蛋白：16%%±0.5%%（通过氨基酸平衡）
                        - 代谢能：11.2MJ/kg
                        **经济性**：综合成本下降17-20%%

                        ### 方案三：生长平衡方案
                        **营养配比**：
                        - 黄金蛋白比：19-20%%（豆粕+棉粕复合体系）
                        - 能量梯度设计：12.0MJ/kg（分早晚饲喂）
                        - 添加0.1%%复合有机酸
                        **优势特征**：
                        - 料肉比优化至2.8:1
                        - 胸肌发育与腿肌发育协调增长
                        - 应激反应降低30%%

                        ## 执行建议
                        请根据养殖场实际情况，重点说明：
                        1. 各方案的原料采购可行性（特别标注本地可获取原料）
                        2. 不同季节的饲喂调整建议
                        3. 与当前生长阶段的匹配度分析（需引用《临武鸭饲养规范》相关条款）""",
                body.getWeight(),
                body.getChestWidth(),
                body.getTibiaLength(),
                growthStage
        );

        String result = QianWenChat.callWithMessage(prompt);
        return new Result(formatAsTable(result), 200, "分析成功");
    }

    // 根据体重和胸宽推导生长阶段
    private String inferGrowthStage(Double weight, Double chestWidth) {
        if (weight < 2.5) return "生长期（60-90日龄）";
        if (chestWidth < 12.5) return "育肥前期（90-120日龄）";
        return "育肥后期（120日龄以上）";
    }

    // 将Markdown转换为纯文本
    private String formatAsTable(String rawText) {
        return rawText
                // 移除标题标记
                .replaceAll("#{1,6}\\s*", "")
                // 转换加粗为冒号
                .replaceAll("\\*\\*(.*?)\\*\\*", "$1：")
                // 移除表格线
                .replaceAll("[|-]{5,}", "")
                // 转换列表项为缩进
                .replaceAll("-\\s+", "    ")
                // 保留结构化缩进
                .replaceAll("(\\d+\\.)\\s", "  $1 ")
                // 统一换行符
                .replaceAll("\\n{3,}", "\n\n");
    }
    @PostMapping("/allDuck")
    public ResponseEntity<?> analyzeDucks(@Valid @RequestBody DuckCountDto request) {
        List<DuckMetricsPojo> ducks = generator.generate(request);
        AIService.AnalysisResult result = aiService.analyze(ducks);

        // 保持原有返回结构不变
        return ResponseEntity.ok(Map.of(
                "ducks", ducks,
                "analysis", convertResult(result)
        ));
    }

    // 轻量转换，仅包装成旧地返回结构，但保留原有层级信息
    private Map<String, Object> convertResult(AIService.AnalysisResult result) {
        Map<String, Object> analysis = new LinkedHashMap<>();
        analysis.put("score", result.getHealthScore());
        analysis.put("scoreReason", result.getScoreReasons());
        analysis.put("abnormalDucks", result.getAbnormalDucks());
        analysis.put("suggestions", result.getCategorizedSuggestions());
        analysis.put("summary", result.getSummaryAnalysis());
        return analysis;
    }
    @PostMapping("return")
    public Result returnString() {
        String content = "11\n" +
                "检测到的鸭子数量\n" +
                "9个月\n" +
                "鸭群平均年龄\n" +
                "7/10\n" +
                "健康评分\n" +
                "病鸭检测结果 (2例)\n" +
                "#1\n" +
                "异常94%\n" +
                "症状: 针状抗体异常升高、食欲减退、精神萎靡\n" +
                "#2\n" +
                "营养不良89%\n" +
                "症状: 体重减轻、发育迟缓、羽毛粗糙\n" +
                "健康评分原因\n" +
                "检测到疑似病鸭，需要进一步观察\n" +
                "部分鸭只体征异常\n" +
                "发现针状抗体异常升高\n" +
                "部分鸭只出现长期不动、不进食现象\n" +
                "疾病防治建议\n" +
                "疾病防治措施\n" +
                "加强饲养环境的卫生管理，定期消毒养殖场所\n" +
                "提高饲料质量，确保营养均衡，添加适量维生素和矿物质\n" +
                "建立完善的免疫程序，定期进行健康检查\n" +
                "隔离观察异常鸭只，防止疾病传播\n" +
                "改善饲养环境，增加活动空间，促进鸭群运动\n" +
                "总结\n" +
                "健康状况\n" +
                "鸭群整体健康率约为81.8%\n" +
                "检测到2只疑似病鸭，需要进一步观察\n" +
                "风险提示\n" +
                "检测到1只高风险病鸭，存在疾病传播风险\n" +
                "检测到针状抗体异常和营养不良，需密切关注疾病发展趋势\n" +
                "部分鸭只出现长期不动、不进食现象，需要特别关注\n" +
                "建议行动\n" +
                "对检测到异常的鸭只进行隔离观察，防止疾病传播\n" +
                "针对营养不良鸭只，调整饲料配方，增加优质蛋白质和微量元素\n" +
                "改善饲养环境，定期消毒，降低疾病传播风险\n" +
                "增加鸭群活动空间，促进运动，防止行动迟缓\n" +
                "定期监测鸭群健康状况，及时发现异常";

        String imageURL = "https://interview-agent.oss-cn-beijing.aliyuncs.com/f42ba70b-d84d-4fcb-b903-a23b01b55765.png";

        Map<String, String> response = new HashMap<>();
        response.put("content", content);
        response.put("imageURL", imageURL);

        return new Result(response, 200, "返回成功");
    }

}
